// 导入express

const express = require('express')

// 创建服务器实例对象
const app = express()

const joi = require('joi')

// 导入cors中间件
const cors = require('cors')
// 将cors注册为全局中间件
app.use(cors())

// 配置解析表单数据的中间件  注意：这个中间件只能解析application/X-www-form-urlencoded格式的表单数据
app.use(express.urlencoded({extended:false}))



// 自定义全局响应数据的中间件，一定要放在路由的前面 res.cc()全局中间件
app.use((req,res,next)=>{
  // status = 0为成功；status = 1为失败！默认status 的值设置为1，方便处理错误的情况
  res.cc = function(err,status = 1){
    res.send({
      // 状态
      status,
      // 状态描述，判断err是错误对象，还是字符串
      message:err instanceof Error ? err.message : err,
    })
  }
  next()
})


// 在路由模块之前导入配置解析Token的中间件
const  expressJWT = require('express-jwt')

const config = require('./config')
app.use(expressJWT({secret:config.jwtSecretKey}).unless({path:/^\/api/}))




// 导入路由模块
const userRouter =  require('./router/user')
app.use('/api',userRouter)

const userinfoRouter = require('./router/userinfo')
app.use('/my', userinfoRouter)

// 文章分类的路由模块
const artCateRouter = require('./router/artcate')
app.use('/my/article',artCateRouter)

// 发布新文章
const articleRouter = require('./router/article')
app.use('/my/article',articleRouter)

// 定义错误级别的中间件
app.use((err,req,res,next)=>{
  if(err instanceof joi.ValidationError ) return res.cc(err)
  // 身份认证失败后的错误
  if(err.name === 'UnauthorizedError') return res.cc('身份验证失败')
  // 未知错误
  res.cc(err)
})





// 启动服务器
app.listen(8001,function(){
  console.log('api server running at http://127.0.0.1:8001');
})

